#ifndef SESSIONFRIENDAREA_H
#define SESSIONFRIENDAREA_H

#include <QWidget>
#include <QScrollArea>
#include <QLabel>

////////////////////////////////////////////
/// 滚动区域中的 Item 的类型
////////////////////////////////////////////

enum ItemType
{
    SessionItemType,
    FriendItemType,
    ApplyItemType
};

////////////////////////////////////////////
/// 这个滚动区域的实现
////////////////////////////////////////////

class SessionFriendArea : public QScrollArea
{
    Q_OBJECT
public:
    explicit SessionFriendArea(QWidget *parent = nullptr);

    // 清空该区域中所有的 item
    void clear();

    // 添加一个 item 到该区域中,
    // SessionItem---> id = chatSessionId
    // FriendItem/ApplyItem---> id = userId
    void addItem(ItemType itemType, const QString& id, const QIcon& avatar, const QString& name, const QString& text);

    // 选中某一个指定的 item
    void clickItem(int index);

    // 滚动到顶部
    void scrollToBegin();

private:
    // 后续往 container 内部的 layout 中添加元素，就能够触发 QScrollArea 滚动效果
    QWidget* container;

signals:
};

////////////////////////////////////////////
/// 滚动区域中的 Item 的实现
////////////////////////////////////////////

class SessionFriendItem : public QWidget
{
    Q_OBJECT
public:
    SessionFriendItem(QWidget* owner, const QIcon& avatar, const QString& name, const QString& text);

    void paintEvent(QPaintEvent *event) override;
    void mousePressEvent(QMouseEvent *event) override;
    void enterEvent(QEnterEvent *event) override;
    void leaveEvent(QEvent *event) override;

    void select();
    // active 函数期望实现 Item 被点击之后的业务逻辑
    virtual void active();
private:
    // owner 就指向了上述的 SessionFriendArea
    QWidget* owner;

    // 这个变量用来表示当前 Item 是否是 "选中" 状态
    bool selected = false;

protected:
    // 让子类使用
    QLabel* messageLabel;
};

////////////////////////////////////////////
/// 会话 Item 的实现
////////////////////////////////////////////

class SessionItem : public SessionFriendItem
{
    Q_OBJECT

public:
    SessionItem(QWidget* owner, const QString& chatSessionId, const QIcon& avatar,
                const QString& name, const QString& lastMessage);

    void active() override;

    void updateLastMessage(const QString& chatSessionId);

private:
    // 当前会话id
    QString chatSessionId;

    // 最后的消息预览
    QString text;
};

////////////////////////////////////////////
/// 好友 Item 的实现
////////////////////////////////////////////

class FriendItem : public SessionFriendItem
{
    Q_OBJECT

public:
    FriendItem(QWidget* owner, const QString& userId, const QIcon& avatar,
               const QString& name, const QString& description);

    void active() override;

private:
    // 好友的用户id
    QString userId;
};

////////////////////////////////////////////
/// 好友申请 Item 的实现
////////////////////////////////////////////

class ApplyItem : public SessionFriendItem
{
    Q_OBJECT

public:
    ApplyItem(QWidget* owner, const QString& userId, const QIcon& avatar, const QString& name);
    void acceptFriendApply();
    void rejectFriendApply();

    void active() override;

private:
    // 申请人的 userid
    QString userId;
};


#endif // SESSIONFRIENDAREA_H
